"""
排班系统GUI主程序
功能：提供用户界面，协调排班逻辑和Excel读写
"""
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
from datetime import datetime
from scheduler import WorkPlan
from excel_io import load_people_from_excel, save_schedule_to_excel


class App(tk.Tk):
    def __init__(self):
        """初始化主窗口"""
        super().__init__()
        self.title("排班系统 v1.0")  # 窗口标题
        self.geometry("500x300")  # 初始窗口大小
        self.people = []  # 存储人员数据的列表
        self.create_widgets()  # 创建界面组件

    def create_widgets(self):
        """构建GUI界面组件"""
        # 文件选择按钮
        ttk.Label(self, text="1. 选择人员文件").pack(pady=5)
        ttk.Button(self, text="浏览...", command=self.load_data).pack()

        # 日期输入框
        ttk.Label(self, text="2. 设置排班日期").pack(pady=5)
        ttk.Label(self, text="开始日期 (YYYY-MM-DD)").pack()
        self.start_entry = ttk.Entry(self)  # 开始日期输入框
        self.start_entry.pack()
        ttk.Label(self, text="结束日期 (YYYY-MM-DD)").pack()
        self.end_entry = ttk.Entry(self)  # 结束日期输入框
        self.end_entry.pack()

        # 生成按钮
        ttk.Button(self, text="生成排班表", command=self.generate).pack(pady=20)

        # 状态栏
        self.status = ttk.Label(self, text="就绪")  # 底部状态提示
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

    def load_data(self):
        """加载人员Excel文件"""
        filepath = filedialog.askopenfilename(
            filetypes=[("Excel文件", "*.xlsx")]  # 限制只能选xlsx文件
        )
        if filepath:
            try:
                # 调用excel_io模块读取数据
                self.people = load_people_from_excel(filepath)
                self.status.config(text=f"已加载 {len(self.people)} 名人员")
            except Exception as e:
                # 错误处理：显示弹窗
                messagebox.showerror("错误", f"文件读取失败：{str(e)}")

    def generate(self):
        """生成排班表主逻辑"""
        try:
            # 获取用户输入的日期并转换为datetime对象
            start_date = datetime.strptime(self.start_entry.get(), "%Y-%m-%d").date()
            end_date = datetime.strptime(self.end_entry.get(), "%Y-%m-%d").date()

            if not self.people:
                raise ValueError("请先加载人员数据")

            # 创建排班计划实例
            plan = WorkPlan(start_date, end_date, self.people)
            plan.generate()  # 执行排班算法

            # 弹出保存对话框
            save_path = filedialog.asksaveasfilename(
                defaultextension=".xlsx",
                filetypes=[("Excel文件", "*.xlsx")]
            )
            if save_path:
                # 调用excel_io模块保存结果
                save_schedule_to_excel(plan.schedule, save_path)
                messagebox.showinfo("成功", f"排班表已保存至：\n{save_path}")

        except ValueError as e:  # 日期格式错误
            messagebox.showerror("输入错误", str(e))
        except Exception as e:  # 其他未知错误
            messagebox.showerror("生成失败", str(e))


if __name__ == "__main__":
    app = App()  # 创建应用实例
    app.mainloop()  # 启动GUI事件循环